Skip to content

Method: computeNextMove(int, IDilemmaPlayer, IDilemmaState)

1: package de.fhdw.gaming.ipspiel23.dilemma.strategy.internals.grim;
2:
3: import java.util.Optional;
4:
5: import de.fhdw.gaming.ipspiel23.dilemma.domain.DilemmaAnswerType;
6: import de.fhdw.gaming.ipspiel23.dilemma.domain.IDilemmaPlayer;
7: import de.fhdw.gaming.ipspiel23.dilemma.domain.IDilemmaState;
8: import de.fhdw.gaming.ipspiel23.dilemma.domain.IDilemmaStrategy;
9: import de.fhdw.gaming.ipspiel23.dilemma.moves.IDilemmaMove;
10: import de.fhdw.gaming.ipspiel23.dilemma.moves.IDilemmaMoveFactory;
11: import de.fhdw.gaming.ipspiel23.dilemma.strategy.internals.DilemmaMemoryStrategy;
12: import de.fhdw.gaming.ipspiel23.dilemma.strategy.internals.DilemmaRoundData;
13: import de.fhdw.gaming.ipspiel23.dilemma.strategy.internals.DilemmaRoundPlayerData;
14: import de.fhdw.gaming.ipspiel23.memory.GameMemoryCapacity;
15: import de.fhdw.gaming.ipspiel23.memory.IGameMemory;
16: import de.fhdw.gaming.ipspiel23.memory.IGameMemoryCapacity;
17:
18: /**
19: * Implements {@link IDilemmaStrategy} by cooperating until the enemy defected once,
20: * and then defecting for the rest of the game.
21: */
22: public class DilemmaGrimStrategy extends DilemmaMemoryStrategy {
23:
24: /**
25: * Creates an {@link DilemmaGrimStrategy}.
26: *
27: * @param moveFactory The factory for creating Dilemma moves.
28: */
29: DilemmaGrimStrategy(final IDilemmaMoveFactory moveFactory) {
30: super(moveFactory);
31: }
32:
33: @Override
34: public Optional<IDilemmaMove> computeNextMove(final int gameId,
35: final IDilemmaPlayer player,
36: final IDilemmaState state) {
37: final IGameMemory<DilemmaRoundData> memory = getMemoryForPlayer(player, state);
38: // always cooperate on first round
39:• if (memory.size() == 0) {
40: return Optional.of(getMoveFactory().createCooperateMove());
41: }
42: // check if enemy defected in any of the last rounds
43:• for (int i = 0; i < memory.size(); i++) {
44: final DilemmaRoundData previousRound = memory.getRound(i, true);
45: final DilemmaRoundPlayerData otherPlayersAction = previousRound.forOpponentOf(player);
46:• if (otherPlayersAction.answer().equals(DilemmaAnswerType.DEFECT)) {
47: return Optional.of(getMoveFactory().createDefectMove());
48: }
49: }
50:
51: return Optional.of(getMoveFactory().createCooperateMove());
52: }
53:
54: @Override
55: protected IGameMemoryCapacity requestedMemoryCapacity() {
56: return GameMemoryCapacity.unlimited();
57: }
58: }